package com.naiterui.ehp.bs.patient.service;

import com.naiterui.common.repository.page.PageVO;
import com.naiterui.ehp.bp.bo.consult.ConsultSessionListBo;
import com.naiterui.ehp.bp.domain.ConsultSession;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bp.utils.payment.bo.UnifiedOrderResultBO;
import com.naiterui.ehp.bs.patient.bo.SendPatientBillBO;
import com.naiterui.ehp.bs.patient.vo.consult.ConsultVO;

import java.util.Collection;
import java.util.Map;

/**
 * 问诊会话业务接口
 *
 * @author Amber
 * @since 1.0.0
 */
public interface IConsultSessionService {

    PageVO<ConsultVO> getMyConsultSessions(Long patientId, int page, int num) throws BusinessException;

    /**
     * 获取会话实体
     * IConsultSessionService.getConsultSessionById()
     *
     * @param consultId
     * @return
     * @Author Amber
     * @Date 2016年2月4日
     * @since 1.0.0
     */
    ConsultSession getConsultSessionById(Long consultId);

    /**
     * 根据患者跟医生查询最后一个会话
     * IConsultSessionService.getLastConsultByPatientAndDoctor()
     *
     * @param patientId
     * @param doctorId
     * @return
     * @Author xuchong
     * @Date 2016年7月29日
     * @since 1.0.0
     */
    ConsultSession getLastConsultByPatientAndDoctor(Long patientId, Long doctorId);

    /**
     * 获取患者图文咨询信息
     * IConsultSessionService.getPatientConsultFee()
     *
     * @param patientId
     * @param doctorId
     * @return
     * @Author xuchong
     * @Date 2017年3月31日
     * @since 1.0.0
     */
    Map<String, Object> getPatientConsultFee(Long patientId, Long doctorId) throws BusinessException;

    /**
     * 图文咨询支付
     * IConsultSessionService.addPatientConsultPayInfo()
     *
     * @param patientId
     * @param doctorId
     * @return
     * @throws BusinessException
     * @Author xuchong
     * @Date 2017年3月31日
     * @since 1.0.0
     */
    UnifiedOrderResultBO addPatientConsultPayInfo(Long patientId, Long doctorId, String ip, Integer origin) throws Exception;

    /**
     * 校验图文咨询可否聊天接口
     * IConsultSessionService.checkMessageConsultStatus()
     *
     * @param patientId
     * @param doctorId
     * @return
     * @Author xuchong
     * @Date 2017年4月1日
     * @since 1.0.0
     */
    Map<String, Object> checkMessageConsultStatus(Long patientId, Long doctorId) throws BusinessException;

    /**
     * 图文咨询成功回调接口
     * IConsultSessionService.messageConsultCallBack()
     *
     * @param orderSn   订单号
     * @param payStatus 订单状态
     * @author xuchong
     * @date 2017年4月2日
     * @since 1.0.0
     */
    void updateNotifyPay(String orderSn, Integer payStatus) throws BusinessException;

    /**
     * <pre>
     *     无效会话
     * </pre>
     *
     * @param patientId 患者ID
     * @param doctorId  医生ID
     * @param sessionId 会话ID
     */
    void updateConsultInvalid(Long patientId, Long doctorId, String sessionId) throws Exception;

    /**
     * 给患者发送通知，是否退款成功
     *
     * @param success 是否成功 成功 true 失败 false
     * @param orderSn 订单号
     */
    void updateNoticePatient(boolean success, String orderSn);

    /**
     * 退费给患者推送通知
     *
     * @param sendPatientBillBO 通知信息
     */
    void sendPatientBill(SendPatientBillBO sendPatientBillBO);

    /**
     * 检查会话结束是否超过24小时
     *
     * @param consultSessionId
     * @param type
     * @return
     */
    Boolean endMessageValid(Long consultSessionId, Integer type) throws BusinessException;

    /**
     * 获取医生服务次数
     *
     * @param doctorId
     * @return
     * @throws BusinessException
     */
    Map<Long, Integer> getDoctorServiceNum(Collection<Long> doctorId) throws BusinessException;

    /**
     * 获取患者图文咨询记录
     *
     * @param patientId
     * @param page
     * @param num
     * @return
     */
    PageVO<ConsultSessionListBo> consultSessionList(Long patientId, int page, int num) throws BusinessException;
}
